using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Web;
using BEL;
using AEL.BOD;

//using adpDELBodArchivoPlano = DEL.BOD.DO_Bod_Archivo_Plano;

namespace APR
{
    public class AP_Bod_Archivo_Plano : IAPR
    {
        #region Adapter
        private CEL.BOD.DO_Bod_Archivo_Plano _adpBod_Archivo_Plano;
        private CEL.BOD.DO_Bod_Archivo_Plano adpBod_Archivo_Plano
        {
            get
            {
                if (_adpBod_Archivo_Plano == null)
                    _adpBod_Archivo_Plano = new CEL.BOD.DO_Bod_Archivo_Plano();
                return _adpBod_Archivo_Plano;
            }
        }
        #endregion

        #region Operacion de Datos
        public bool Atras(Scope s, object p_Objeto, string p_Proceso)
        {                         
                Bod_Archivo_Plano p_Objeto_ = (Bod_Archivo_Plano)p_Objeto;
                if (p_Objeto_.Estado == "ARC" && p_Proceso == "PEN")
                {
                    try
                    {
                        adpBod_Archivo_Plano.Adapter.BeginTransaction();
                        DEL.BOD.DO_Bod_Archivo_Plano.Delete_Archivo(s, p_Objeto_);
                        Bod_Archivo_Plano p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                        p_Objeto_Nuevo.Estado = p_Proceso;
                        p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                        if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                        {
                            p_Objeto_ = p_Objeto_Nuevo;
                        }
                        adpBod_Archivo_Plano.Adapter.CommitTransaction();
                    }
                    catch
                    {
                        adpBod_Archivo_Plano.Adapter.RollbackTransaction();
                        throw;                        
                    }
                }
                else if (p_Objeto_.Estado == "VAL" && p_Proceso == "ARC")
                {
                    try
                    {
                        adpBod_Archivo_Plano.Adapter.BeginTransaction();
                        DEL.BOD.DO_Bod_Archivo_Plano.Delete_Con_Detalles(s, p_Objeto_);
                        Bod_Archivo_Plano p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                        p_Objeto_Nuevo.Estado = p_Proceso;
                        p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                        if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                        {
                            p_Objeto_ = p_Objeto_Nuevo;
                        }
                        adpBod_Archivo_Plano.Adapter.CommitTransaction();                      
                    }
                    catch 
                    {
                        adpBod_Archivo_Plano.Adapter.RollbackTransaction();
                        throw;                       
                    }
                }
                else if (p_Objeto_.Estado == "CON" && p_Proceso == "VAL")
                {
                    try
                    {
                        adpBod_Archivo_Plano.Adapter.BeginTransaction();
                        DEL.BOD.DO_Bod_Archivo_Plano.Delete_conteo_Fisico(s, ref p_Objeto_);
                        Bod_Archivo_Plano p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                        p_Objeto_Nuevo.Estado = p_Proceso;
                        p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                        if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                        {
                            p_Objeto_ = p_Objeto_Nuevo;
                        }
                        adpBod_Archivo_Plano.Adapter.CommitTransaction();
                    }
                    catch 
                    {
                       adpBod_Archivo_Plano.Adapter.RollbackTransaction();
                       throw;                                             
                    }
                }               
                return true; 
        }

        public void EmitirExcepcion (string mensaje, string caso)
        {
            Exception eCaso = new System.Exception(caso);
            Exception otroEX = new System.Exception(mensaje, eCaso);
            throw otroEX;
        }

        bool ExisteFichero(string pathRelativo)
        {
            if(string.IsNullOrEmpty(pathRelativo)
                || pathRelativo.EndsWith(".")) return false;
            string pathAbsoluto = HttpContext.Current.Server.MapPath(pathRelativo);
            return File.Exists(pathAbsoluto);  
        }

        public bool Adelante(Scope s, object p_Objeto, string p_Proceso)
        {
            Bod_Archivo_Plano p_Objeto_ = (Bod_Archivo_Plano)p_Objeto;
            if (p_Objeto_.Estado == "PEN" && p_Proceso == "ARC")
            {
                try
                {
                    adpBod_Archivo_Plano.Adapter.BeginTransaction();
                    if (!ExisteFichero(p_Objeto_.Destino_Ruta_Nombre))
                    { EmitirExcepcion(TXT_Mensajes._MSJ42, ""); }
                    Bod_Archivo_Plano p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                    p_Objeto_Nuevo.Estado = p_Proceso;
                    p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                    if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                    {
                        p_Objeto_ = p_Objeto_Nuevo;
                    }
                    adpBod_Archivo_Plano.Adapter.CommitTransaction();
                }
                catch 
                {
                    adpBod_Archivo_Plano.Adapter.RollbackTransaction();
                    throw;                   
                }
            }
            else if (p_Objeto_.Estado == "ARC" && p_Proceso == "VAL")
            {
                try
                {
                    adpBod_Archivo_Plano.Adapter.BeginTransaction();
                    DEL.BOD.DO_Bod_Archivo_Plano.Insert_Datos(s, p_Objeto_);
                    Bod_Archivo_Plano p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                    p_Objeto_Nuevo.Estado = p_Proceso;
                    p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                    if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                    {
                        p_Objeto_ = p_Objeto_Nuevo;
                    }
                    adpBod_Archivo_Plano.Adapter.CommitTransaction();
                }
                catch 
                {
                    adpBod_Archivo_Plano.Adapter.RollbackTransaction();
                    throw;                    
                }
            }
            else if (p_Objeto_.Estado == "VAL" && p_Proceso == "CON")
            {
                try
                {
                    adpBod_Archivo_Plano.Adapter.BeginTransaction();
                    DEL.BOD.DO_Bod_Archivo_Plano.Insert_Conteo_Fisico(s, ref p_Objeto_);
                    Bod_Archivo_Plano p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                    p_Objeto_Nuevo.Estado = p_Proceso;
                    p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                    if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                    {
                        p_Objeto_ = p_Objeto_Nuevo;
                    }
                    adpBod_Archivo_Plano.Adapter.CommitTransaction();
                }
                catch 
                {
                    adpBod_Archivo_Plano.Adapter.RollbackTransaction();
                    throw;                   
                }
            }
            return true;
        }

        public bool Actualizar(Scope s, object p_Objeto_Original, object p_Objeto)
        {

            Bod_Archivo_Plano v_Objeto_ = (Bod_Archivo_Plano)p_Objeto;
            Bod_Archivo_Plano v_Objeto_Original_ = (Bod_Archivo_Plano)p_Objeto_Original;
            int estadoId = adpBod_Archivo_Plano.Update(s, v_Objeto_, v_Objeto_Original_);
            return true;
        }

        public bool Permiso(Scope s, object p_Objeto, string p_Proceso)
        {
            throw new NotImplementedException();
        }

        public object GetById(Scope s, string p_Id)
        {
            List<Bod_Archivo_Plano> resultado = new List<Bod_Archivo_Plano>(1);
            try
            {
                resultado = adpBod_Archivo_Plano.GetById(s, p_Id);
            }
            catch
            {
                EmitirExcepcion(TXT_Mensajes._MSJ47, p_Id);
            }

            if (resultado.Count == 0)
                EmitirExcepcion(TXT_Mensajes._MSJ47, p_Id);

            return resultado[0];
        }

        private Bod_Archivo_Plano CopiarObjeto(Bod_Archivo_Plano p_Objeto)
        {
            Bod_Archivo_Plano nuevoObjeto = new Bod_Archivo_Plano(p_Objeto);            
            return nuevoObjeto;
        }
        #endregion

    }
}